home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
dcview
/
src
/
cutsub.c
next >
Wrap
Text File
|
1997-03-05
|
13KB
|
457 lines
#include <sxdef2.h>
#include <stdio.h>
#include <iocslib.h>
#include <stdlib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxmemory.h> /* メモリマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "DC.h"
#define BUF_X 128
#define BUF_Y 16
#define CUTMODE 1
#define TITLEMODE 2
typedef unsigned char BYTE2;
typedef BYTE2 LINEBUF[ BUF_X ];
typedef struct {
short dx, dy;
LINEBUF buffer[ BUF_Y ];
} TEXTBUF;
typedef BYTE2 CONDBUF[ 1 + BUF_X/8 + BUF_X ];
void cutPrint();
int cutType();
int cutType2();
int cut(ComVal *pcv, char *fileName)
{
unsigned char headder[49];
FILE *cutFile;
int plane = 3;
int x0, y0, x1, y1;
char ext[5];
char **dmy1;
char *pt;
int fileLen;
pcv->rc.d.left = 0; /* FillImg レクタングル */
pcv->rc.d.top = 0;
pcv->rc.d.bottom = 16;
if (( cutFile = fopen( fileName, "rb")) == NULL ) {
EMDeCross();
DMError(D_RED | D_CONFIRM, "cutsub.c\rファイルがオープンできません!" );
fclose(cutFile);
EMEnCross();
return(0);
} else {
fseek(cutFile, 0L, SEEK_END);
fileLen = ftell(cutFile); /* ファイルサイズを求める */
fseek(cutFile, 0L, SEEK_SET);
dmy1 = NULL;
dmy1 = MMChHdlNew(fileLen+1);
if (dmy1 == NULL) { /* メモリが確保できる? */
DMError(D_CONFIRM | D_RED, "メモリが確保できません!");
fclose(cutFile);
return(0);
}
MMHdlDispose(dmy1);
pcv->cutHdl = MMChHdlNew(fileLen+1);
MMHdlLock(pcv->cutHdl);
fread(*(pcv->cutHdl), sizeof(char), (size_t) (fileLen), cutFile);
fclose(cutFile);
pcv->cutPt = *(pcv->cutHdl);
pt = pcv->cutPt;
*(pt+fileLen) = 1;
read_cut(pcv, headder, 48 );
headder[48] = '\0'; /* ★ごみ防止 (89/04/14) */
if( headder[0] == 0 ) {
if (cutType2(pcv, plane)) { /* Title.sys */
MMHdlUnlock(pcv->cutHdl);
MMHdlDispose(pcv->cutHdl);
return(0);
}
} else if( strncmp( headder, "CUT_V", 5 ) == 0 ) {
if(!cutType(pcv, plane)) { /* cut */
MMHdlUnlock(pcv->cutHdl);
MMHdlDispose(pcv->cutHdl);
return(0);
}
} else {
EMDeCross();
DMError(D_RED | D_CONFIRM, "データが異常です!" );
MMHdlUnlock(pcv->cutHdl);
MMHdlDispose(pcv->cutHdl);
EMEnCross();
return(0);
}
}
MMHdlUnlock(pcv->cutHdl);
MMHdlDispose(pcv->cutHdl);
pcv->cutNo[pcv->depth]++;
return(1);
}
int cutType(pcv, plane) /* ★カットファイル表示 */
ComVal *pcv;
int plane;
{
short dx, dy;
int size, y;
TEXTBUF oneRegion;
CONDBUF cond1, cond2;
BYTE2 *buffer;
int cut_no_buff;
read_cut(pcv, &oneRegion, 4 );
dx = oneRegion.dx;
dy = oneRegion.dy;
pcv->rc.d.right = dx;
pcv->ymax = dy;
pcv->size = dx * dy;
pcv->x_size = dx;
pcv->y_size = dy;
cut_no_buff = pcv->cutNo[pcv->depth];
pcv->cutNo[pcv->depth] = 0;
if (offgraph(pcv) != TRUE)
return(FALSE);
pcv->cutNo[pcv->depth] = cut_no_buff;
pcv->x_size = (dx * pcv->fontS[pcv->font]) / 16;
pcv->y_size = (dy * pcv->fontS[pcv->font]) / 16;
if (offgraph(pcv) != TRUE)
return(FALSE);
GMLockBits(pcv->bitsH[0][pcv->depth]); /* オフライングラフのビッツをロック */
GMLockBits(pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth]); /* オフライングラフのビッツをロック */
GMSetGraph(&pcv->offgraph[0][pcv->depth]); /* 描画をオフライン画面に対して行う */
pcv->offgraph[0][pcv->depth].bmap = &(*pcv->bitsH[0][pcv->depth])->bmap;
GMAPage(G_ALLPAGE); /* カレントグラフの初期設定 */
GMBackColor(G_BLACK);
GMForeColor(G_WHITE);
size = ((( dx - 1 ) >> 3 ) + 1 );
y = 0;
buffer = &oneRegion.buffer;
expand2( buffer, 0, cond2 );
for( ; dy; dy-- ) {
read_cut(pcv, cond1, 1 );
read_cut(pcv, cond1+1, *cond1-1 );
expand1( cond2, size, cond1 );
expand2( buffer, size, cond2 );
buffer += size;
if( ++y == BUF_Y ) {
y = 0;
buffer = &oneRegion.buffer;
cutPrint(pcv, buffer );
}
}
if ( y != 0 ) {
buffer = &oneRegion.buffer;
cutPrint(pcv, buffer );
}
GMSetGraph(&pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth]); /* 描画をオフライン画面に対して行う */
pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth].bmap = &(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->bmap;
GMCopy(&(*pcv->bitsH[0][pcv->depth])->bmap, &(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->bmap,
&pcv->offgraph[0][pcv->depth].rect, &pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth].rect,
G_PSET, NULL);
GMUnlockBits(pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth]); /* オフライングラフのビッツをアンロック */
GMUnlockBits(pcv->bitsH[0][pcv->depth]); /* オフライングラフのビッツをアンロック */
if (pcv->bitsH[0][pcv->depth] != NULL)
/* オフグラフ用のビッツハンドルを廃棄する */
GMDisposeBits(pcv->bitsH[0][pcv->depth]);
/* オフライングラフが作成されていたら */
if (pcv->offgraphOK[0][pcv->depth]) {
/* ビットマップポインタだけヌルにして */
pcv->offgraph[0][pcv->depth].bmap = NULL;
/* グラフをクローズする */
GMCloseGraph(&pcv->offgraph[0][pcv->depth]);
}
return(TRUE);
}
#define H2_MAX 20
int cutType2(pcv, plane) /* ★TITLE.SYSフォーマットデータ表示 */
ComVal *pcv;
int plane;
{
short dx, dy;
int size, y, amari;
TEXTBUF oneRegion;
BYTE2 *buffer;
unsigned char headder2[H2_MAX];
int cut_no_buff;
read_cut(pcv, headder2, H2_MAX );
dx = headder2[H2_MAX - 4];
dx = (dx << 8) + headder2[H2_MAX - 3];
dy = headder2[H2_MAX - 2];
dy = (dy << 8) + headder2[H2_MAX - 1];
if((dx <= 0) || (dy <= 0) || (dx > 1024) || (dy > 1024)) {
EMDeCross();
DMError(D_RED | D_CONFIRM, "cutsub.c\rデータが異常です!" );
EMEnCross();
return(1);
}
oneRegion.dx = dx;
oneRegion.dy = BUF_Y;
pcv->rc.d.right = dx;
pcv->ymax = dy;
pcv->size = dx * dy;
pcv->x_size = dx;
pcv->y_size = dy;
cut_no_buff = pcv->cutNo[pcv->depth];
pcv->cutNo[pcv->depth] = 0;
if (offgraph(pcv) != TRUE)
return(FALSE);
pcv->cutNo[pcv->depth] = cut_no_buff;
pcv->x_size = (dx * pcv->fontS[pcv->font]) / 16;
pcv->y_size = (dy * pcv->fontS[pcv->font]) / 16;
if (offgraph(pcv) != TRUE)
return;
GMLockBits(pcv->bitsH[0][pcv->depth]); /* オフライングラフのビッツをロック */
GMLockBits(pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth]); /* オフライングラフのビッツをロック */
GMSetGraph(&pcv->offgraph[0][pcv->depth]); /* 描画をオフライン画面に対して行う */
pcv->offgraph[0][pcv->depth].bmap = &(*pcv->bitsH[0][pcv->depth])->bmap;
GMAPage(G_ALLPAGE); /* カレントグラフの初期設定 */
GMBackColor(G_BLACK);
GMForeColor(G_WHITE);
if ((dx % 8) == 0) {
size = (dx >> 3) * BUF_Y;
} else {
size = ((dx >> 3) + 1) * BUF_Y;
}
buffer = &oneRegion.buffer;
for(y = dy / BUF_Y; y > 0; y-- ) {
read_cut(pcv, buffer, size );
cutPrint(pcv, buffer );
}
if ((amari = dy % BUF_Y) != 0) {
size = ((((dx * amari)- 1 ) >> 3 ) + 1 );
read_cut(pcv, buffer, size );
cutPrint(pcv, buffer );
}
GMSetGraph(&pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth]); /* 描画をオフライン画面に対して行う */
pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth].bmap = &(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->bmap;
GMCopy(&(*pcv->bitsH[0][pcv->depth])->bmap, &(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->bmap,
&pcv->offgraph[0][pcv->depth].rect, &pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth].rect,
G_PSET, NULL);
GMUnlockBits(pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth]); /* オフライングラフのビッツをアンロック */
GMUnlockBits(pcv->bitsH[0][pcv->depth]); /* オフライングラフのビッツをアンロック */
if (pcv->bitsH[0][pcv->depth] != NULL)
/* オフグラフ用のビッツハンドルを廃棄する */
GMDisposeBits(pcv->bitsH[0][pcv->depth]);
/* オフライングラフが作成されていたら */
if (pcv->offgraphOK[0][pcv->depth]) {
/* ビットマップポインタだけヌルにして */
pcv->offgraph[0][pcv->depth].bmap = NULL;
/* グラフをクローズする */
GMCloseGraph(&pcv->offgraph[0][pcv->depth]);
}
return(0);
}
void cutPrint(pcv, buffer)
ComVal *pcv;
char *buffer;
{
char **buffHdl;
char *pack1;
char *pack2;
long sizep,size;
int i,j,sw;
sizep = pcv->rc.d.right;
pcv->ymax = pcv->ymax - 16;
if (pcv->ymax < 0)
pcv->rc.d.bottom = pcv->rc.d.bottom + pcv->ymax;
sw = sizep % 16;
if ((sw && (sw < 9))) {
if ((sizep % 8)) {
sizep = (sizep / 8) + 2;
} else {
sizep = (sizep / 8) + 1;
}
size = (sizep * 16) + 1024;
buffHdl = MMChHdlNew(size);
MMHdlLock(buffHdl);
pack1 = buffer;
pack2 = *buffHdl;
for (j=0;j<16;j++) {
for (i=0;i<sizep-1;i++) {
*pack2++ = *pack1++;
}
*pack2++ = 0;
}
GMFillImg(*buffHdl,&(pcv->rc));
MMHdlUnlock(buffHdl);
MMHdlDispose(buffHdl);
} else {
GMFillImg(buffer,&(pcv->rc));
}
pcv->rc.d.top = pcv->rc.d.top + 16;
pcv->rc.d.bottom = pcv->rc.d.bottom + 16;
}
int expand1( org, count, cond )
BYTE2 *org;
BYTE2 *cond;
int count;
{
int pt, bt, flag,fgg = 0;
register BYTE2 *head, *body;
if ( *cond == 1 ) {
for( pt=0; pt < count; pt++ ) *org++=0;
return( count );
}
pt = (( count-1 ) >> 3 ) + 1;
body = ( head = cond+1 ) + pt;
for( ; pt; pt-- ) {
flag = *head++;
for( bt=8; bt; bt-- ) {
if ( flag & 0x80 ) {
*org = *body++;
} else *org = 0;
org++;
flag <<= 1;
}
}
return( count );
}
int expand2( org, count, cond )
BYTE2 *org;
BYTE2 *cond;
int count;
{
static LINEBUF orgBuf;
register c;
register BYTE2 *buf;
buf = orgBuf;
if ( count == 0 )
for( c=0; c<BUF_X; c++ )
*buf++ = 0;
else
for( c=0; c < count; c++ ) {
*org = *cond++ ^ *buf;
*buf++ = *org++;
}
return( count );
}
/******************************************************************************
* offgraph(): オフグラフの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
int offgraph(ComVal *pcv)
{
int ret;
Rect rc;
rc.d.top = 0;
rc.d.left = 0;
rc.d.bottom = pcv->y_size;
rc.d.right = pcv->x_size;
/* オフライングラフとワークのグラフをヌルクリアする */
memset(&pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth], 0, sizeof(Graph));
/* オフライングラフ用ビッツを設定する(テキストモードにする) */
pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth] = GMNewBits(G_TXT, &rc, G_ALLPAGE);
if (pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth] == NULL) {
EMDeCross();
DMError(D_RED | D_CONFIRM, "cutsub.c\rメモリが確保できません。");
EMEnCross();
return FALSE;
}
/* ビッツのビットイメージ領域をパレットNo.0でクリア */
memset((*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->data, 0, (size_t)(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->size);
/* オフライングラフ情報の作成 */
pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth].bmap = &(*pcv->bitsH[pcv->cutNo[pcv->depth]][pcv->depth])->bmap;
ret = GMCalcGraph(&pcv->offgraph[pcv->cutNo[pcv->depth]][pcv->depth]);
if (ret != 0) {
EMDeCross();
DMError(D_RED | D_CONFIRM, "cutsub.c\rグラフが作成できません。");
EMEnCross();
return FALSE;
}
/* オフライングラフ作成完了フラグオン */
pcv->offgraphOK[pcv->cutNo[pcv->depth]][pcv->depth] = TRUE;
return TRUE;
}
/******************************************************************************
* dispoBits(): ビッツの解放
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
int dispoBits(ComVal *pcv)
{
int ret;
if (pcv->cutNo[pcv->depth] == 1)
return;
for(ret=(pcv->cutNo[pcv->depth]-1);ret>0;ret--) {
if (pcv->bitsH[ret][pcv->depth] != NULL)
/* オフグラフ用のビッツハンドルを廃棄する */
GMDisposeBits(pcv->bitsH[ret][pcv->depth]);
/* オフライングラフが作成されていたら */
if (pcv->offgraphOK[ret][pcv->depth]) {
/* ビットマップポインタだけヌルにして */
pcv->offgraph[ret][pcv->depth].bmap = NULL;
/* グラフをクローズする */
GMCloseGraph(&pcv->offgraph[ret][pcv->depth]);
}
}
pcv->cutNo[pcv->depth] = 1;
}
/******************************************************************************
* read_cut(): カットデータハンドルから読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *Pt
*/
void read_cut(ComVal *pcv, char *Pt, int Size)
{
memcpy(Pt, pcv->cutPt, Size);
pcv->cutPt += Size;
}
STR@ 1| EdEV 3.00 <